/**
 ******************************************************************************
 * @file debug.c
 * @author GX (2524913364@qq.com)
 * @brief 
 * @version 1.0.0 
 * @date 2022-07-07
 * 
 * @copyright Copyright (c) 2022
 * 
 ******************************************************************************
 *----------------------------------------------------------------------------*
 *  Remark         : Description                                              *
 *----------------------------------------------------------------------------*
 *  Change History :                                                          *
 *  <Date>     | <Version> | <Author>       | <Description>                   *
 *----------------------------------------------------------------------------*
 *  2022-07-07 | 1.0.0     | GX             | Create file                     *
 *----------------------------------------------------------------------------*
 *                                                                            *
 ******************************************************************************
 */
/*
example:

int main ()
{
  int a = 10;
  char *str = "lisi";

  initLog();

  DEBUG_PRINTF("no123  %d, %s, %f, %c\n\r", a, str, 5.0, 'f');
  
  freeLog();
}

*/

/*----------------------------- start of file -------------------------------*/
#include "debug.h"




static FILE *logFp = NULL;
/**
 * @brief 初始化调试函数，打开一个.txt文件用来记录调试信息
 * 
 * @return int 失败返回 -1,成功打开 0.
 */
int initLog()
{
  #ifdef    DEBUG_TEXT
  /* 打开文本，可写的方式打开 */
  logFp = fopen(LOG_FILE, "ab+");
  if (logFp == NULL)
  {
    perror("fopen log txt error");
    return -1;
  }

  /* 获取时间输入到 */
  time_t ret = time(NULL);
  char *curTime = ctime(&ret);
  fprintf(logFp, "\n%s\n", curTime);
  return 0;
#endif  /* DEBUG_TEXT */
}

int freeLog()
{
#ifdef    DEBUG_TEXT
  fclose(logFp);
#endif  /* DEBUG_TEXT */
}






int DEBUG_PRINTF(const char *format,...)
{ 
  FILE *fp = NULL;
#ifdef    DEBUG_TEXT
  fp = logFp;
#else
  fp = stdout;
#endif

#ifdef  DEBUG
  int i = 0;
  /* 实现变参函数---------------------------------------------*/
  /* 1. 包含头文件 <stdarg.h>*/
  /* 2.在函数定义中创建一个va_list类型的变量，用于存储那些不固定的参数 */
  va_list va;       /* 存储传进来的实参 */

  /* 3.调用函数 va_start() 获得变参函数的变参前的一个固定参数的地址(fotmat) */
  va_start(va, format);

  /* 4.不断地调用va_arg()使得va指向下一个实参，该宏函数也会返回实参的值 */
  while(format[i] != '\0')
  {
    if (format[i] == '%' && format[i+1] == 'd') 
    {
      fprintf(fp, "%d", va_arg(va, int)); /* va_arg()可以去的数据的值 */
      i++;
    }
    else if (format[i] == '%' && format[i+1] == 'f') 
    {
      fprintf(fp, "%f", va_arg(va, double)); /* va_arg()可以去的数据的值 */
      i++;
    }
    else if (format[i] == '%' && format[i+1] == 's') 
    {
      fprintf(fp, "%s", va_arg(va, char*)); /* va_arg()可以去的数据的值 */
      i++;
    }
    else if (format[i] == '%' && format[i+1] == 'c') 
    {
      fprintf(fp, "%c", va_arg(va, int)); /* va_arg()可以去的数据的值 */
      i++;
    }
    else 
    {
      fprintf(fp, "%c", format[i]); /* va_arg()可以去的数据的值 */
    }
    i++;
  }
  /* 5.最后调用va_end()表示变参处理完成 */
  va_end(va);

#endif  /* DEBUG */

}


 

/*------------------------------ end of file --------------------------------*/

